約 1,267,707 件
https://w.atwiki.jp/rubyiw/pages/33.html
1.どの世代のプログラミング言語であるのか 2.どのような環境で動作するのか 3.変数の種類および取り扱い 4.演算子 5.制御構造 6.コメントの書式 先日の考察では、『3.変数の種類及び取り扱い』までをやってみたのである。 というわけで、『4.演算子』からということになろう。 4.演算子 ぶっちゃけたところ、プログラミング言語に演算子がないと、何もできないと断言してよい。別段、クラスがなくてもプログラムは作れるのだけれど。 なにせ太古の昔、コンピュータは『電子計算機』と呼ばれていたのだから。 無論今では死語だが。 計算機というぐらいだから、計算できなければならないのである。計算を行うためには、演算子がなければ話にならんというわけだ。プログラミング言語の話はちょっと横へおいておき、諸君、電子式卓上計算機、通称電卓を想起して欲しいのだ。 あれにあなた、+、-、×、÷、=のボタンが存在せぬとしてみよ。押した数字ボタンの数が順番に表示されるだけの機械に成り下がってしまうのだ。そのような数字表示機、価格が1円でも欲しくあるまい。逆に10円くれたっていらない。プログラミング言語においても、演算子が存在しないというのはそういうことになるわけだ。 さて、一口に演算子といっても、いくつかの種類があり、さらにそれぞれ細分化されるのである。 (1).算術演算子 算術演算子には、通常の計算用演算子と、プログラミング言語というか、コンピュータの世界ならではのビット演算子があるのだ。 さらに細分化すれば、計算用演算子には、単項演算子、二項演算子、そして三項演算子がある。ややこし過ぎるな。自分自身でもよくわからなくなってきた。 二項演算子というのはすぐに理解できるだろう。通常の四則演算は次のようなスタイルで行うのが一般的なのだから。 1+1 5ー3 8×8 10÷5 上記の+、ー、×、÷が二項演算子ということになるわけだ。二つの項から新たなひとつの数を導きだす演算子ということになるのである。コンピュータ上では、×とか、÷の1バイト文字がないので(なんでないのだろう?)、+、-、*、/ と表記するのだが。 ここでひとつ疑問が沸いてこないだろうか?例えば、 5-3+1 とか、 3*6-4/2 などの計算の場合、どう呼ぶのかということだ。それぞれ、三項演算子とか、四項演算子と呼ぶのであろうか? いやさ。残念ながら、上記の式の中に登場する演算子は全て『二項演算子』なのである。 そもそも数値の計算というものは、数がたくさん登場してきたところで、一気にどばーっとやるわけではない。 例えば、 5-3+1の計算であれば、まず 5という項から 3という項を引いて 2という数、すなわち項を得て、それに 1という項を加算し、 3という結果、これまた項を導き出すのである。 要するに、いくら項がたくさんあったところで、単に、二項演算を繰り返し、繰り返しして結果を求めるに過ぎないのだ。 ではもうひとつの式、3*4-6/2はどうか?これはまず3と6の乗算を行い、18という項を得る。この項をちょっと横に置いて、4と2で除算を行い、2という項を得るのである。ここで先ほど横に置いていた18という項に登場してもらって、18から2を減算して、最終的に16という項を得るわけだ。 何故登場した順番に計算しないのか?それは『演算子には優先順位がある』からだ。*や/すなわち乗算や除算は、+や-すなわち加減算より優先順位が高いわけだ。これは、数学的にしっかりルールが定められていて、プログラミング言語仕様もそれに則って作られている。当たり前だ。演算子に独自の優先順位をつけようものなら、そんなややこしい言語は誰も使ってくれないのである。 この計算式で、まず最初に6-4を計算したい場合、一体どうすればよいのか。答えは簡単で、3*(6-4)/2 とすればよいのだ。()で式をくくると、まず()の中を先に計算しなさいというルールになる。 これはどういうことかというと、()は*/よりもさらに優先順位が高い『演算子』ということになるわけである。 四則演算の他に、Rubyでは次のような計算用演算子が用意されている。 5 % 3 剰算(整数除算の余りを求める)この例の場合、演算結果は2となる。 5 ** 3 べき乗(この例の場合、5の3乗で、結果は125だ) 二項演算子については理解いただけただろうか? それでは、単項演算子とはなんであろうか?炭坑演算子ではないので注意が必要だ。 単項演算子には、次の二つが準備されている。 -a +a なんだこれはと思われた方もおられよう。ここでポイントとなるのは、これまでの演算子の例であれば1+1という風に、項が数字であったのだが、上記単項演算子の例では、aというアルファベットになっている。このaとはいったいなんぞやというと、16進数の Aすなわち10進数の10のことではなく、変数を現しているのである。単項演算子は、作用する項が変数でないと意味がないのだ。 なぜか? それは、単項演算子を実際に使って動きを確認してみればよいのである。 諸君におかれては、お手持ちのパソコンにActiveScriptRubyをインストールされているだろうか?もしまだであれば、是非インストールしていただきたいのだが、絶対に嫌だとおっしゃる方には無理強いしない。お話だけ聞いていてもらいたい。 ActiveScriptRubyをインストーラー任せでお気楽極楽インストールすると、スタートメニューにRuby1.Xというグループが作成される。そこに『irb』というショートカットができていると思う。 irbとはなんぞや。『irb』とは、interactive rubyの略であって、対話方式でコマンドまたは式を実行でき、さらにその結果を表示してくれるツールだ。 せっかくこのような便利なツールがあるので、これを使って単項演算子を検証してみたいのである。 では、irbを起動してみよう。 先ほど申し上げたように、スタート→Ruby 1.X→ irbと選択してもよいし、スタート→Ruby1.X→Ruby Consoleと選択してDOSプロンプトを起動し、そこでおもむろにirbと入力してもよいし、もしRuby実行モジュールが格納されているフォルダにパスが通っているのなら、 DOSプロンプトで『irb.bat』(または、batを省略してirb)としてもよい。 なんなら、エクスプローラでRubyの実行モジュールが入っているフォルダ(例:c \Program Files\ruby-1.8\bin)を開いて、irb.batをダブルクリックして起動してもよいのである。 irbを起動すると、次のような、極めてシンプルなコマンドプロンプト画面が開く。 それではまず変数を定義し、値を設定してみよう。 a=-3と入力し、エンターキーを押す。すると、次のように表示されると思う。 a=-3という式で、変数aにはもちろん-3という値が格納されたわけだが、この式自身の値も-3になったのだよということを現すのが、= -3という行と考えていただければよい。 ではここでお待ちかね、単項演算子を使用してみよう。-aと入力してもらいたい。 いかがだろうか。ついに、驚くべき変化が現れたであろう。といってもそんなにたいしたことはないが。もともと-3という値を格納していた変数 aに、単項演算子 -(マイナス)を作用させると、符合が反転し、プラスになるのである。これは、算数の世界ではおなじみ、『マイナスにマイナスを掛けるとプラスになっちゃうよ』という法則をRubyが遵守しているに過ぎないのだ。 もし変数aが正の値を持っていた場合、単項演算子 -(マイナス)を作用させると、常識的にマイナスとなるわけだ。単項演算子には、 +(プラス)と -(マイナス)が存在するのだが、はっきりいってプラスの単項演算子はただの気休め、もともとの値が何も変わらないのだから、あまり意味がないのである。 さらに、これで単項演算子というものが、変数に作用してこそ意味があるというのもご理解いただけるのではないだろか。-3という式があったとして、これを記述した本人が『いいや。これは、3という数値オブジェクトに対し、マイナスの単項演算子を作用させたものなのだ。しかと相違ない』と、いくら主張したところで、世間一般には『ふーん。これは-3という定数なのだネ』と見做されてしまうからなのだ。 単項演算子の解説はこれにて終了し、次は三項演算子を解説したいわけだが、ちょっとその前に、単項演算子の動作確認に使用した対話型Ruby実行環境irbが非常に興味深いものなので、これについて触れておきたいと思うのだ。 irbの実行ファイル本体は、30行程度の短いバッチファイルである。では、そのバッチファイルの中身を見てみよう。 001 | @echo off 002 | @if not "%~d0" == "~d0" goto WinNT 003 | "C \PROGRA~1\ruby-1.8\bin\ruby" -x "C /PROGRA~1/ruby-1.8/bin/irb.bat" %1 %2 %3 %4 %5 %6 %7 %8 %9 004 | @goto endofruby 005 | WinNT 006 | "%~dp0ruby" -x "%~f0" %* 007 | @goto endofruby 008 | #!C /PROGRA~1/ruby-1.8/bin/ruby 009 | # 010 | # irb.rb - intaractive ruby 011 | # $Release Version 0.9.5 $ 012 | # $Revision 11708 $ 013 | # $Date 2007-02-13 08 01 19 + 0900 (Tue, 13 Feb 2007) $ 014 | # by Keiju ISHITSUKA( keiju@ruby-lang.org) 015 | # 016 | 017 | require "irb" 018 | 019 | if __FILE__ == $0 020 | IRB.start(__FILE__) 021 | else 022 | # check -e option 023 | if /^-e$/ =~ $0 024 | IRB.start(__FILE__) 025 | else 026 | IRB.setup(__FILE__) 027 | end 028 | end 029 | __END__ 030 | endofruby このバッチファイルのキモは、3行目の、 003 | "C \PROGRA~1\ruby-1.8\bin\ruby" -x "C /PROGRA~1/ruby-1.8/bin/irb.bat" %1 %2 %3 %4 %5 %6 %7 %8 %9 の部分である。ここで一体なにをやっているのかというと、自分自身を、C \PROGRA~1\ruby-1.8\bin\ruby すなわち、Ruby本体(Rubyのスクリプトを解析し、実行するインタプリタプログラム)に引き渡しているのである。 その後、4行目の、 007 | @goto endofruby で、ファイルの最終行までぶ飛んでいる。すなわち処理を終了しているのである。 Ruby本体にどのような内容が引き渡されるのかというと、17行目から29行目が引き渡され、実行されるわけだ。ここがプログラムの中身になる。 で、どんな処理をしているのかというと、if文でいろいろと判定して、ごそごそとやっているけれども、大事なのはこれ、 IRB.start(__FILE__) の部分に他ならない。 17行目のrequire "irb"で、外部定義クラスIRBをインポートして(使用可能にして)、そのIRBクラスが持つ静的メソッド、startを呼び出しているのだ。 コマンドプロンプトからユーザの入力を受け付け、解析実行する機能が全をこのIRBクラスが持っており、startメソッドを呼び出すことにより、それが実行されるということになるわけである。 当然このIRBクラスの定義は、Rubyで記述されているのである。さすがはオブジェクト指向であると、そのパワーをまざまざと思い知らされたことと思うし、また、これまでVisualStudioなどを使い、Windows専門のアプリケーションばかりを作成してこられた方には、このバッチファイルの中にスクリプトを埋め込み、インタプリタを起動して云々という記述が、異質であるが面白いものに感じられると思ったので、時間を割いてご紹介してみたというわけである。 さて、計算用演算子の最後は、三項演算子である。 三項演算子とはなにかというと、読んで字のごとく、演算が作用する項が三個存在する演算子のことである。 こんな感じだ。 3 + ( a 4 ? 1 b ) なにやら数字や変数が三個以上出てきてややこしいけれども、項に当たるものはどれどれかというと、 3、1、b の三つだ。では a 4 というのは何かというと、条件判定式なのである。 三項演算子の一般的な形式は次のようになる。 <式> ? <真の場合の式> <偽の場合の式> 従って、?と ペアで、三項演算子と呼ぶのである。 サンプルの式では、最終的に、 3に、なにかしら値を加算したいのであるが、変数 aの値が4未満であれば1を、4以上であれば変数bに格納されている値とするわけだ。 これもできれば、めいめいirbで動作を確認しておいていただきたい。 変数a、bにそれぞれ任意の値を格納して、式を実行するのである。 おっと。これは余談であるが、Rubyには残念ながら、というか幸運にもと言うべきなのか、C言語ファミリー(Javaも含めて)にある、インクリメント演算子、デクリメント演算子はない。 a++や、--aというやつだ。 これは非常に便利なのだが、使い方を誤ると思わぬ誤動作を引き起こす可能性がある(言語側からすると予定の動作なのだが、人間様の思惑から外れるということ)。という理由からかどうかは不明だが、とにかくRubyには準備されていない。 よろしいかな。では『ビット演算子』に話を移そう。 (ii).ビット演算子 最近の若き、未来あるプログラマの方は、もしやビット演算などご存じないかもしれない。なぜかというと、教育担当者や先輩が教えないことが多いからだ。 なぜ教えないのかというと、知っていても、使用する局面に遭遇しないからだ。このオブジェクト指向プログラミング全盛の時代では。ちまちまとビットを操作している暇があれば、フレームワークの使い方でも勉強せよというわけなのである。 しかし、全く使わないかというとそうでもなく、時折ビット演算処理が見え隠れする場合もあるので、知識として知っておいたほうがよいだろう。 Rubyのビット演算子には、以下のものが準備されている。 ~a ビット否定(not) a b ビット積(and) a | b ビット和(or) a ^ b ビット排他的和(xor) a b 左シフト(a を b 回左シフト) a b 右シフト(a を b 回右シフト) 各演算子の働きについては、皆さんirbで試してみて欲しい。 例えば、|(ビット和or)ならば、 などという風に。 さて、これで算術演算子の解説は終わりだ。 では次に『代入演算子』の説明をしよう。 (2).代入演算子 代入演算子とは、ある変数に値を代入するときに使用する演算子である。算術演算子を解説するときに、既に何度も登場しているから、既にみなさんも見当がついていると思う。 a=1 と、この = が、代入演算子である。上記の式では、変数aに1という値が代入される。というのは、Ruby的に正しくなく、『数値の1というオブジェクト』の参照を変数aが持つのである。 日本語的に表現すると、この式は『aの値は(=)1なんですよ』と言っているわけであって、非常に明瞭なものなのだが、この代入演算子 (=)を『aと1とは等しいですよ』という比較にも使用している、若干困り者の言語があるのをご存知の方もおられるだろう。 VisualBasic言語がそうである。 かの言語の場合、文脈でどちらかを判断するようで、まあよく考えてあるとも言えるが、なんとなく寝覚めの悪さを感じる方もおられよう。 では、Rubyはどうか?ご安心いただきたい。この後で解説するが、比較演算子の等値は、C言語ファミリーと同様に == と記すようになっている。 代入演算子の右辺には、二項演算子を記述することもできる。 a=3+4 上記の式では、当然のことながら変数aには7が代入されるのだ。だが、当然と言い切るにはやはりあるルール付けが必要になってくることは言うまでもない。 なぜならば、上記の式は、『まず変数aに3を代入して、その後 4を加算する。すなわち、変数aの値は3となり、式全体が持つ値が7となるのだ』という解釈も成り立つはずだ。結果は同じだけれど、計算の順番が違ってくることに注目していただきたいのだ。 しかし残念ながらというか、幸いなことにそうはならない。 なぜならば、算術演算子 + は、代入演算子 = より優先度が高いから、まず3+4という式が評価されて、その値がaに代入されるということになる。 無理やり先ほどの解釈の通りにしたければ、 a=(a=3)+4 と、aに対する3の代入を()でくくって、演算結果を改めてaに代入すればよいというわけだ。非常に回りくどいけれども。 代入演算子とは基本的に = のみと考えてよいわけだが、『自己代入』という便利な記述方式がある。ある値を保持している変数があるとして、その値に別の値を加減乗除もしくはビット演算した結果を持たせたいとすると、どのように記述するだろうか。言葉で表現すると非常に回りくどいが、式にしてしまうと簡単だ。 a=10 a=a/2 これは、10という値を持っているaという変数があって、その値を2で除算した結果をまた変数aに代入するのである。変数aの値は5となるわけだ。別にこれはこれで何の問題もない。 だが、いるのである。やはり『a=a+1 なんて書くのは面倒ダナ』というズボラな連中である。 というか、こういったズボラな連中が、もっと簡単に素早くできる方法はないものかと模索してきた結果、プログラミング言語が今日このように発展してきたともいえる。勿論、ズボラといってもそんじょそこらのズボラではなく、天才的なズボラでなくてはならないのだけれど。 とまあ、そこで登場したのが、『自己代入』の記述方式なのである。自己代入の書式では前出のa=a/2の式は、次のようになる。 a/=2 Rubyにおける自己代入の書式をリファレンスマニュアルに求めてみると、次のようになっている。 文法 式1 op= 式2 # 式1は通常の代入の左辺のいずれか op は以下のいずれかです。演算子と=の間にスペースを空けてはいけません。 +, -, *, /, %, **, , |, ^, , , , || さらに、Rubyには、『多重代入』という機能が提供されていて、次のような記述が可能だ。 a, b, c = 1, 2, 3 見た目の通り、変数aには1、bには2、cには3が代入されるのだ。実に当たり前なのであるが、ほとんどのプログラミング言語で、この当たり前の記述を行うことができないのである。 多重代入機能は、Perlを流れをくむ、スクリプト系言語の専売特許といっても過言ではないだろう。 代入演算子についてご理解いただけたところで、次に『関係演算子』の説明に移ろう。 (3).関係演算子 関係演算子とは、値の大小を比較する条件式で使用する演算子のことである。比較演算子と表現する場合もある。 Rubyには、次のような比較演算子が準備されている。 a b a は b より小さい(b未満) a = b a は b より小さいか等しい(b以下) a b a は b より大きい(b超過) a = b a は b より大きいか等しい(b以上) a == b a は b と等しい a != b a は b と等しくない a = b a と b との大小を返す。 (a b なら負、a == b なら0、a b なら正) 関係演算子の式は、条件を満たせばその値が真(TRUE)となる。この関係演算子が活躍する局面は、やはりifによる条件分岐となるわけだ。 if a b then # 真(TRUE)の時の処理 else # 偽(FALSE)の時の処理 end 関係演算子自体には、これ以上特筆すべきことはない。 ただし、最後の a = b という書式は、他のプログラミング言語ではあまり見かけないので、驚かれた方もおられるだろう。 説明をよく読んでみると、変数aと変数bに、整数であれ実数であれ、数値が入っていた場合、a - b という算術演算をしたのと同じなのである。ただし、この演算子は、算術演算子をオーバーライドしていないけれども、なんらかの大小関係があるクラスのインスタンス間では有効だ。 さて、残念ながら、単純に二項だけを比較するのみでは、とてもではないがまともに動くプログラムは作れない。何が言いたいのかというと、実際にプログラムを作成するにあたっては、条件判断というものは、もっともっと複雑になりがちであるということだ。 例えば、『ある変数の値が、2以上でかつ、5以下の場合』とか、『変数aの値が3で、かつ変数bの値が8の場合』とか、『変数aの値が4か、変数bの値が7か、どちらかの場合』と、いくつかの条件組み合わせて判定しなければならない局面が往々にしてあるのだ。 そこで登場するのが、『論理演算子』なのである。 (4).論理演算子 論理演算子は、前項の関係演算子の解説で出てきた、『かつ』とか『または』を式として表現するものなのである。 !a 論理否定 not a 論理否定(!aと同様の意味) a b 論理積(かつ)| a and b 論理積( と同様の意味) a || b 論理和(または) a or b 論理和(||と同様の意味) 前出の『ある変数の値が、2以上でかつ、5以下の場合』を論理演算子を使って表現してみると、次のようになる。 a =2 a =5 または、 a =2 and b =5 上記二つの式は、日本語の文章をそのままプログラムの式に移し変えたものだが、論理的には次のように書いても有効だ。 a 1 a 6 または、 a 1 and a 6 2以上ということは、1より大きいということだし、5以下ということは6未満なのだから、これらの式は論理的に正しいということになる。 さて、ここで疑問に思っていただきたいことがあるのだが、!とnot、 とand、||とorは、同じ意味なのだ。それぞれ、論理否定、論理積、論理和である。 ではなぜ、それぞれ二種類存在するのであろうか。これもまたRubyの特色で、他のプログラミング言語で、このように論理演算子を二種類用意してあるものは少ない。なぜならちょっと混乱するからだ。 実は、Rubyにおいては、これら対応する二種類の論理演算子に、評価される優先順位を設定している。 !、 、||は、それぞれnot、and、orより優先順位が高い。 a==1 b==2 || c==3 上記の式を書いた実装者の思惑としては、bが2かまたはCが3で、かつaが1のときのみ真となって欲しいのだが、残念ながらそのような結果にはならない。 Cが3でありさえすれば、a、bの値はなんの意味もなく、この式は真となってしまうのである。 実装者君の思惑通りの結果を得るためには、 a==1 (b==2 || c==3) とすればよいのだが、Rubyでは、次のように記述できるということである。 a==1 and b==2 || c==3 このように、論理演算子の表記方法が二種類存在し、それぞれに優先順位がつけられていると、非常に便利なように見える(実際に便利なのであるが)。 だが、あまり多用されないほうが賢明ではないかと私などは思うのである。なぜなら、先ほども述べたように、論理演算子を二種類用意しているプログラミング言語は少ないから、他のプログラミング言語で開発せざるを得なくなったときのために、同一優先順位の演算子を使い、()で順番を明確にするという書き方を平素から勤めておくべきだと、老婆心ながら思う次第だ。 以上で、『算術演算子』、『代入演算子』、『関係演算子』、『論理演算子』と見てきたわけだが、一応これで、普遍的な演算子を解説し終えたことになる。 しかし、演算子の種類はこれだけではなく、プログラミング言語には、おのおの趣向を凝らした特殊なものが他にも用意されている。Rubyにも当然あるのだ。 (5).範囲演算子 a..b a 以上 b 以下の値の範囲 a...b a 以上 b 未満の値の範囲 と、演算子の書式説明をしただけでは、一体どのように使用するかよくわからないかもしれない。 範囲演算子は、例えば次のように使用する。 (1..10).each { |i| puts i.to_s } コードを眺めているだけで、このコードが何をやっているのかはぼんやりとお分かりになるのではと思う。そう、 1から10までの数字を順番に画面表示しているのだ。ではこのコードをirbで確認してみよう。 irbは、そのまま使用すればワンライナー(1行プログラム)のみ受け付けるのだが、上記のように、最初の行で何も入力せず、リターンキーだけを押すと、複数行モードになる。 複数行モードとなったサインは、 が、*に変わることだ。そのままどんどん入力していって、とりあえずコマンドが完結したとirbが判断すれば、勝手に実行してくれるのだ。 上記の例では、4行目の}を入力した時点で、コマンドが完結したと判断され、実行されるのである。 1から10まで順番に画面表示されているのがわかるだろう。 このコードのキモは、どう見ても範囲演算子で構築された、(1..10) というモノだ。ではこれは一体何物なのかというと、これもまた『オブジェクト』であり、『Rangeクラス』のインスタンスなのである。 この Rangeクラスが、内部要素を順に繰り返し処理する、eachメソッドを持っているということになるわけだ。 であるから、明示的に次のようにして生成することも可能である。 robj = Range.new(1,10) robj.each { |i| puts i.to_s } ではこれも、irbで確認してみよう。 irbの実行結果を見てみると、Rangeクラスのインスタンスの生成で、1..10のRangeオブジェクトが生成されているのがよくわかると思う。 次の二行だ。 irb(main) 002 0* robj = Range.new(1,10) = 1..10 (6).マッチング演算子 『正規表現(regular expression)』という言葉を聞かれたことがあると思う。『正規表現』とは、単独または連続した文字列が、ある特定のパターンに適合するかどうかを検査するための書式のことだ。 『正規表現』を真剣に解説しだすと、平気で本一冊終わってしまうので、世に正規表現の解説書は多く出版されているし、インターネットでも多くの有識者が解説しているので、そちらを参考にしていただきたい。 マッチング演算子には次のものがある。 /r/ =~ a aが正規表現rにマッチするなら a =~ /r/ aが正規表現rにマッチするなら /r/ === a aが正規表現rにマッチするなら a === /r/ aが正規表現rにマッチするなら /r/ !~ a aが正規表現rにマッチしないなら a !~ /r/ aが正規表現rにマッチしないなら 以上で演算子の解説は終了である。
https://w.atwiki.jp/taichik15/pages/55.html
演算子 全てのメソッドは演算子 Scalaのメソッドは演算子のように使える 例えば、 1 + 2 は、 1.+(2) と同じ 右被演算子 メソッド名の末尾がコロン( )の場合は右被演算子から呼ばれる 例えば、 1 2 Nil は、 Nil. ( 2 ). ( 1 ) と同じ apply, update applyとupdateは、シンタックスシュガーが用意されている 例えば、 a.apply(b) は、 a(b) と同じで、 a.update(b, c) は、 a(b) = c と同じ。 前置演算子 !pのように演算子が変数の前にくる演算子。 !は、 unary_! のように定義されている。 前置演算子として使えるのは、 +, -, !, ~ のみ。
https://w.atwiki.jp/stgbuilder/pages/459.html
(物理演算) 物体の重力設定 物体の衝突判定 物理エンジンによる当たり判定と、通常の攻撃防御判定の関係 まったく別のシステムとして動作。 同じサイズの当たり判定を用意しても、片方のみヒットすることがある。 攻撃ヒットタスクで、即消滅させると物理演算の判定ができない可能性がある。 回避するには、攻撃ヒットタスクで攻撃フラグを落とし、1フレームウエイト後に消滅させる。 攻撃フラグを落とすのと同時に表示を消せば、物理演算により1フレームだけ角度が変化した絵が表示されることを防げる。 現状での制約(v0.99.77) 親の座標に同期する子は、物理演算できない プレイヤーやオプションは、物理演算できない スクロールに同期しているキャラクタは、動いてないように見えるが動いている。 そのため、垂直に積み上げたキャラクタが崩れることがある。 背景に形状を割り当てることはできないため、1個ずつ手作業でキャラクタとして配置する必要あり。 めり込みやすり抜けは完全に抑制できない。 キャラクタがまれに異常な速度になることある。 将来の展望 複雑な形状の追加 ジョイントやロープといった多彩な物体の追加 背景との連携 演算できないキャラクタへの演算拡張 など 物理演算 物体の種類 完全物理演算モード フォースとインパルス 重力と重力影響度 密度との関係 反発係数 グループ番号とマスクビット・カテゴリビット ゲーム設定>>ゲーム設定 物理演算 キャラクタ編集>>物理演算 タブ スクリプト編集>>物理演算パネル>>重力,パラメータ,フォース,インパルス,トルク MMEのようなパーティクル・フィジックスがあれば・・・エフェクト編集の代わりになるのに -- 名無しさん (2012-05-22 00 52 07) 重力設定を、加速度設定として、画面に対する方向で指定する方法と、特定キャラクタを指定する方法があれば面白い ①画面に対する方向を指定できれば、重力の方向を自由に設定できる ②特定キャラクタを1個指定できれば、そのキャラクタを中心に旋回する円軌道ができる ③特定キャラクタを2個指定できれば、その2個のキャラクタを焦点にして旋回する楕円軌道ができる -- ルーピー (2012-06-22 23 30 02) バネの弾性力や糸の張力、電磁気力みたいな遠隔的な引力・斥力も欲しいな 浮力や空気抵抗、流体とかも実現できたらスゴイ -- 名無しさん (2012-06-23 17 38 51) static:動かずに、他キャラクタに影響を与える kinematic(力に反応しない動く物体):動いて、他キャラクタに影響を与えるが、影響は受けない dynamic(通常の動く物体):動いて、他キャラクタに影響を与え、影響を受ける 影響は受けるけど、影響は与えないって物体はないの?? -- 名無しさん (2012-06-24 10 57 04) 糸:一定の長さで、一定の力を発揮する 一定の長さ以上にはならず、一定の長さ以下になるとたわんで力を発揮しなくなる →円運動や振り子運動へ バネ:一定の長さ(自然長)では力0で、それより短くなったり、長くなったりすると、変位に比例した復元力(弾性力)を発揮する 一定の長さ以下、長さ以上になると、弾性力を失う(降伏点) →伸びるバネ、縮むバネの運動へ 磁石:同極には引力、異極には斥力を及ぼし、遠隔にも作用するが、距離の2乗に反比例して弱くなる →磁力や静電気力、引力へ -- 名無しさん (2012-06-24 11 04 43) 名前 コメント
https://w.atwiki.jp/futoyama/pages/63.html
四則演算は以下の expr コマンドを使う。 例 $ expr 3 + 1 -- expr 3+1 はだめ。数字と演算子の間はスペースが必要 4 $ expr 16 - 7 9 $ expr 18 / 9 2 $ expr 9 * 9 81 $ expr 17 % 4 1 括弧を使う場合はエスケープが必要。 $ expr 5 * \( 2 + 1 \) 15 bashであれば、「$((式))」で式を囲むと計算ができる。 「$((式))」だと式の結果はコマンドラインへの入力となるだけで、表示されないためechoコマンドで表示している。 $ echo -n $((3+1)) 4 $ echo -n $((16-7)) 9 $ echo -n $((18/9)) 2 $ echo -n $(( 9 * 9 )) -- (( )) の間にスペースを入れてもOK 81 $ echo -n $(( 17%4 )) 1 $ echo -n $((5*(2+1))) -- 式には括弧も使える。 15 計算結果を変数に入れて使いたい場合は、以下のようにする。 $ Var1=`expr 1 + 1` -- `(バッククォート)で囲む $ echo $Var1 2 $ Var2=$((1+3)) $ echo $Var2 4 「expr」だと、オペランドと演算子の間にスペースが必要だったり、優先を表す括弧もエスケープが必要だったりで使いにくいので、「$((式))」の方がよいですね。 名前 コメント
https://w.atwiki.jp/crsavrkouza/pages/50.html
4.基本演算 計算のため,各種演算子が用意されています.通常の四則演算はそのまま行えます.また,=で代入ができます. 記号 演算 書式 意味 + 加算 x + y xにyを加える. - 減算 x - y xからyを引く. * 乗算 x * y xにyを掛ける. / 除算 x / y xをyで割る. % 剰余算 x % y \xをyで割った余りを求める. = 代入 x = y xにyを代入する. 基本は通常の四則演算と同じですが,一部異なるところがあります. 例えば=は代入であるというところです.「等しい」ではありません.値をコピーして「等しくする」です, さらに,もしその結果が変数の表しうる範囲を超えていたら.オーバーフローして正常な結果は得られません. 演算に伴って型が変化することがあります. 整数 , 整数 → 整数 整数 , 実数 → 実数 実数 , 実数 → 実数 ここで注意するべきなのは,整数 / 整数 も整数であることです.つまり,商を求めるということです. 例 × 7 / 3 = 2.33333333・・・ 〇 7 / 3 = 2 注意しないと予期せぬ結果を生むことがあります. 例 ×7 / 3 * 3 = 7 〇7 / 3 * 3 = 6 7/3は商の2という結果を返します.それから3をかけると6になります. 同じ数で割ってから掛けても必ず元に戻るとは限りません.ただし,どちらかが実数であれば大丈夫です. 四則演算を使ったプログラムの例を示します. 例 2つの整数a, bを入力し, 和a + bを出力する #include stdio.h int main(void) { int a, b; printf("a = ");scanf("%d", a); printf("b = ");scanf("%d", b); printf("a + b = %d\n\r", a+b); return 0; } では,ここで一つプログラムを書いてもらいましょう 演習1 1つの整数を入力し,その桁数を出力する 演習2 2つの正整数n, mを入力し, nのm桁目の数字を出力する なお,累乗が必要になりますがそれは#include stdio.h の下に#include math.h を記述して 使用可能になるpow関数を使います.pow(a.b)でa^bが求められます.double型です. 期待される動作 n = 353; m = 2 nのm桁目は5です
https://w.atwiki.jp/tetdm/pages/19.html
ビット単位でデータを考える #include stdio.h main() { unsigned char x;//8ビットで符号なしデータ(0から255まで表現) x = 255;//8ビットが,すべて1 printf("x = %x\n",x);//16進数表示するので,4ビット毎に表示する } ビット毎に論理演算を行う {{{ ビットごとの論理積}}} {{{ | ビットごとの論理和}}} {{{ ^ ビットごとの排他的論理和}}} {{{ ~ 1の補数(否定)}}} 00000011 00000101 の論理積を計算する #include stdio.h main() { unsigned char x,y,z; x = 0x03;//00000011 y = 0x05;//00000101 z = x y; printf("z = %x\n",z); } 演習 全ての演算子について,演算の様子が分かるプログラムを作成する.
https://w.atwiki.jp/my-sql/pages/59.html
HOME 関数 数値関数 算術演算 算術演算 通常の算術演算子を利用することができます。注意 ‘-’、‘+’、‘*’ で、両方の引数が整数の場合、結果は BIGINT(64 ビット)の精度で計算されます。 どちらか一方の引数が符号なしの整数で、もう一方も整数の場合、結果は符合なしの整数になります。 + 加算 mysql SELECT 3+5; - 8 - 減算 mysql SELECT 3-5; - -2 * 乗算 mysql SELECT 3*5; - 15 mysql SELECT 18014398509481984*18014398509481984.0; - 324518553658426726783156020576256.0 mysql SELECT 18014398509481984*18014398509481984; - 0 最後の式の結果は正しくない。これは、この整数乗算の結果が BIGINT 計算の 64 ビットの範囲を超えるため。 / 除算 mysql SELECT 3/5; - 0.60 ゼロで割ると結果は NULL になる。 mysql SELECT 102/(1-1); - NULL 除算が BIGINT 演算で計算されるのは、結果が整数に変換されるコンテキストでその演算が実行された場合に限られる。
https://w.atwiki.jp/crsavrkouza/pages/51.html
6.ビット演算 2進数に特有の演算としてビット演算があります.論理演算とビットシフトに分けられます. bitごとに行う論理演算として,論理和OR, 論理積AND, 論理否定NOT, 排他的論理和XORがあります. 演算 記号 意味 OR | 一方,または両方が1なら1, 両方0なら0 AND 両方1なら1, 一方,または両方が0なら0 NOT ~ 0なら1,1なら0 XOR ^ 一方が1なら1,両方が1,または0なら0 演算の例を下に示します. OR|一方,または両方が1なら1, 両方0なら0 0 | 0 = 0 0 | 1 = 1 1 | 0 = 1 1 | 1 = 1 AND 両方1なら1, 一方,または両方が0なら0 0 0 = 0 0 1 = 0 1 0 = 0 1 1 = 1 NOT~0なら1, 1なら0 ~0 = 1 ~1 = 0 XOR^一方が1なら1, 両方が1,または0なら0 0 ^ 0 = 0 0 ^ 1 = 1 1 ^ 0 = 1 1 ^ 1 = 0 ビットシフトはビットが移動するものです.左辺のビット列を右辺の数の分だけ左右に移動させます. 新たに表れる部分は0になります. 演算 記号 例 左ビットシフト 0b11010111 3 = 0b10111000 右ビットシフト 0b10011100 2 = 0b00100111 これらはbitごとの操作をするときによく使います. PCでのプログラミングではそこまで使う機会は会いませんが,マイコンでは頻繁に使います.
https://w.atwiki.jp/perlrefs/pages/13.html
演算子 前項で突如出現した謎の記号=(イコール)。正体は悪の組織「演算子」の一味であることはわかったが、はてさて、悪の組織「演算子」とは一体どんな組織なのか… 次項には続かない。 「はよ進めんかい」 さて、謎の=という記号が「演算子」というものだということは、前項で既に説明したと思います。 では、演算子というものは、一体どんなものなのか、ということを、今回説明していきます。 「あー、悪の組織じゃないのねん」 「演算子」の「演算」というのは、聞いたことがあると思います。 計算するなどの意味ですね。 それに「子」という字が加わっただけです。 この場合の「子」という字には…まぁ、なんか意味があるんですけど、 「ちゃんと説明せぇよ」 まぁ、個人で調べていただけると…。 とにかく、演算子には、「計算する」なんていう意味があります。 計算をするためには、どんな記号を用いるでしょうか。 そうです、+や-もあります。 下記をご覧ください。 my $plus = 5 + 5; my $sub = 5 - 5; my $dev = 5 / 5; my $date = 5 * 5; これらの演算子は、算出演算子といい、足す引く掛ける割るなど、数字を計算するためにしようされます。
https://w.atwiki.jp/mugencns/pages/44.html
参考http //homotaro.s44.xrea.com/etc.htm 一部見づらい記号があります。注視。 ■演算子について MUGENで使うことのできる数式・条件式用の演算子について またTriggerの具体例を一部。 真偽について Triggerは「0以外(真)」か「0(偽)」で判定する。 条件式は基本的に条件が合ってれば1(真)を、合わなけれ0(偽)を返す。なおトリガー情報の形式によっては固有の演算を行うためそのままの状態で演算子を利用することはできない。例1:文字列を返すタイプ。Statetype = Enemy,StateTypeは不可。>T-/StateType 例2:固有の演算処理を行うタイプ。5 = AnimElemは不可。>T-/AnimElem 上記の情報でも条件式を()で囲えばその真偽の数値(1.0)に演算子を使うことはできる。例3:(MoveType=A)=(Enemy,Movetype=A) 計算と型について 数値にはInt型とFloat型とが存在する。 Int型は正数のみを扱え、Float型は小数を扱えるが桁が大きくなると細かいズレが生じる。Int型とInt型の計算はInt型、Float型とFloat型の計算はFloat型を返す。 Int型とFloat型での計算の場合、Float型が優先され、Float型になる。 使用出来る演算子 =,!=, , , =, = 等号・不等号 数値の比較数値情報と数値情報の間に挟み、左右の数値が等しいか・等しくないかを判定。「=」は左右の数値が等しいなら1(真)を、等しくないなら0(偽)を返す。 「!=」は左右の数値が等しくないなら1(真)を、等しいなら0(偽)を返す。 「 」は左が右より大きいなら1(真)、そうでないなら0(偽)を返す。 「 =」は左が右以上(同じを含む)なら1(真)、そうでないなら0(偽)を返す。 「 」は左が右より小さいなら1(真)、そうでないなら0(偽)を返す。 「 =」は左が右以下(同じを含む)なら1(真)、そうでないなら0(偽)を返す。 「!=, =, =」の=は右側。= ,= はエラーで落ちる。=!はエラーにならないが右をNOT処理する条件式になってしまう。 例:「 10!=9 」は真(1)だが、「 10=!9 」は(!9)=(0)で(10=0)の偽(0)となる。 +,-,*,/ 算術演算子 指定の計算をする+加算・-減算・*掛け算・/割り算のおなじみの数学記号。 数値情報と数値情報の間に挟むことで計算を行う。 割り算の右を「0」にしてはいけない。エラーが流れる。また、割り算は整数のみで行うと上手く処理されない場合がある。Int型とInt型同士の計算ではFloat型にならないため小数が切り捨てられる。 その場合左右の数値に*1.0などを入れFloat型にすると処理されるようになる。 なお「-マイナス」は数値情報の冒頭に記述でき、プラス(正数)をマイナス(負数)に・マイナスをプラスに変換する。 % 剰余 ※MUGEN独自記述・算術演算子「%」はMUGEN特有の演算子で、割り算の余りを返す。 10%5は余り0なので0を、14%4は余り2なので2を返す。 (xxx%10)と記述すれば1桁目のみを抽出できる。 対応は整数型の数値のみ。小数型の数値に使うとエラーで落ちるため注意。 ** 冪(べき)乗 ※MUGEN独自記述・算術演算子n乗算、のはずだが挙動がやや不安定のため基本使わないほうが良い。Int型同士の冪乗の場合、計算が一部安定しない。 整数同士かつ片方か両方を*1.0などでFloat型にすると計算が安定しやすい。ただしFloat型は7桁以上の数値になるとズレが生じるため要注意。 検証不足※小数単位の数値の冪乗も計算が不安定らしいが、詳しくは不明。 ※-Float型を入れた正数同士うまく計算が行かないケースはあるのか? !, ,||,^^ 論理演算子 条件が合っているかを確認する。「!」はNOT。付けた右の情報を0(偽)を1(真)に、0以外(真)を0(偽)に変換する符号。 「 」はAND。左右の情報が両方共0以外(真)だった場合のみ、1(真)を返す。 「||」はOR。左右の情報どちらかでも0以外(真)なら、1(真)を返す。 「^^」はXOR。左右の情報どちらか片方のみが0以外(真)なら、1(真)を返す。 ,|,^ ビット演算子 整数の値のbit情報で演算を行う。「 」はAND 「|」はOR 「^」はXOR説明はやや難しいのでbit演算のページを参照 補足・数値範囲指定 数値情報=(XX,XXX) (,)内の左数値より上・右数値未満の条件。 数値情報=[XX,XXX] [,]内の左数値以上・右数値以下の条件。「=」は「!=」(範囲内でない)でも良い。 ()と[]は組み合わせることが可能。[XX,XXX)や(XX,XXX]でも良い。 ただし直後に別の演算子を配置してはならない。「情報=[X,XX] 情報」などはエラーで落ちる。 直後に演算子を指定したい場合は「(情報=[X,XX]) 情報」と()で囲う必要がある。 ()の処理について ()で囲った場合、内部の優先順位を高め、個別に処理をする。数式を囲えばちゃんと数式の答えをまとめる。 条件式を囲った場合は真偽の数値(1.0)を数式に利用できる。例:130 + (Statetype=C) + 2*(Statetype=A)StateType=Cなら131,Aなら132、それ以外なら130になる式。 記述の優先度 Triggerは1行ごとに読み込みを行う。 基本的に左から右の順で計算を行うが優先度により処理は前後する。 上の方が優先順位が高い 同じ高さは記述時の読み込み基準。「 () 」:()内に書かれた式は優先される。()内部の順番は優先度に従う。 「 ! 」「 - 」:情報の手前に付ける符号 「 ** 」:n乗 「 * 」「 / 」「 % 」」: 「 + 」「 - 」: 「 」「 = 」「 」「 = 」: 「 = 」「 != 」: 「 = 」:※後述 「 」:(bit演算を =するときは注意) 「 ^ 」: 「 | 」: 「 」:論理演算子の順番には注意。 「 ^^ 」: 「 || 」:()が無ければ「 でまとめる→||でわける」の順番。 記述例 1 + 2 - 3 * 4:この数式は*が優先され3*4の12、その後1+2-12で-9となる。 (1 + 2 - 3)* 4:()で1+2-3を囲った場合、()内の計算が先で0*4となり0となる。 1 || 1 0:ではまず1 0が(0)、1||(0)は1なので、1(真)の記述。 (1 || 1) 0:だと()の比較が先で1||1が(1)だが、(1) 0なので、0(偽)の記述。 ■Lv1-具体例 基本的にCommonステートから参照 +■具体例 120番ステート(ガード始動) [State 120, 5]type = ChangeStatetrigger1 = AnimTime = 0value = 130 + (statetype = C) + (statetype = A)*2 条件式を()で囲うことで条件の1(真),0(偽)を計算に使う記述の代表例。 Statetype=Cなら+(1)で131、Statetype=Aなら+(1)*2で132へ、それ以外なら130へ飛ぶ計算である。 ちなみにAnimTime=0は「アニメ表示が一周した」という条件。よく使われる。 122番ステート(空中ガード待機) [State 132, 3]type = VarSettrigger1 = 1sysvar(0) = (pos y = 0) (vel y 0) パラメーターへ条件式をそのまま指定すると条件の1(真),0(偽)を指定できる。 Pos Y = 0は地面よりも下側、Vel Y 0は速度が下向き、の条件。 で繋げているので、その両方が1(真)なら1を、どちらかが0(偽)なら0を、sysvar(0)へ代入する。 5000番ステート(通常くらい) [State 5000, 5] ;State type gets set to aerial if getting hit uptype = StateTypeSettrigger1 = Time = 0trigger1 = GetHitVar(yvel) != 0 || GetHitVar(fall)trigger2 = Pos Y != 0statetype = a Trigger1は!Time(ステートに移った直後)で、GetHitVar()(受けた攻撃の情報)が yvel(縦のふっとばし速度)が0以外、あるいはfall(倒れ属性)の場合。 Trigger2は、Pos Y(縦の座標)が、地面(0)以外(!0)の場合。 どちらかが適合した場合、状態をStatetype=A、空中にするという命令。 ちなみに と||は、TriggerXと近い関係にあり、 それぞれを統合したり、分解したりすることもできる。 統合した例 [State 5000, 5]type = StateTypeSettrigger1 = Time = 0 ( GetHitVar(yvel) != 0 || GetHitVar(fall) ) || Pos Y != 0statetype = a 分解した例 [State 5000, 5]type = StateTypeSettrigger1 = Time = 0trigger1 = GetHitVar(yvel) != 0trigger2 = Time = 0trigger2 = GetHitVar(fall)trigger3 = Pos Y != 0statetype = a ただし条件式の統合・分解は分かりやすい・編集しやすい程度がいい。 上記の場合、統合すると一行が長すぎて分かりづらく、 分解も!Timeが2個もあり仮に編集するとき二箇所も変える必要が出てくる。 分かりやすい統合分解は後の編集も楽になるため意外と重要である。 5100番ステート(倒れ着地) [State 5100, 3] ;Hit ground anim (for hit up)type = ChangeAnimtrigger1 = time = 0trigger1 = (anim = [5051,5059]) || (anim = [5061,5069])trigger1 = SelfAnimExist(5100 + (anim % 10))value = 5100 + (anim % 10) 「%」の剰余計算を利用したアニメ変更処理。 概要としては特殊な吹っ飛び状態から倒れた場合、専用の倒れ着地モーションにする処理。 SelfAnimExist()の中に指定するAnimを指定し、しっかりと存在するかを確認。 もし存在しなければ別の記述で通常の倒れモーションを使用するようになっている。 5100番ステート(倒れ着地) [State 5100, 8]type = GameMakeAnimtrigger1 = Time = 1value = 60 + (sysvar(1) 5) + (sysvar(1) 14)pos = 0, 0under = sysvar(1) = 14 条件式in数式の例2。sysvar(1)は接地時点(!Time)のVel Yが入っている。 基本は60番のエフェクトを、(Under=1)キャラの後ろ側へ表示するが、 倒れ着地までの速度が5より大きかったら、61番のエフェクトを使用。 更に14より大きかったら、62番のエフェクトを(Under=0)手前側に表示。 ■Lv3-「 =]Var代入 +■Lv3-「 =」条件式内でVar代入を行う演算子 ※フォントの関係上「 」が見づらいです。 Lv3-「 =」条件式内でVar代入を行う演算子 「 =」を使うことで、条件式の中でVarSetを行うことができる。参照された場合のみ代入を行える。 Trigger1 = var(1) = 1 ;参照した際、var(1)に1を代入する。 なお論理演算子とbit演算子よりも優先度は上である。 もちろん演算子のため、文字列指定のパラメーターには使えない。0,1指定のタイプでもIgnorehitpauseなどは文字列指定タイプなので注意 Sysvar()とSysfvar()には使うことができない。var()とfvar()のみ。 数値情報としては代入した数値そのものとして扱う。Trigger1 =(var(2) = 0) (var(3) = 20) ;情報としては(0) (20)の扱い。 並べて用いるときは「1||」や「0 」を前に書くと管理しやすい。 なおPersistent=0設定は一度実行した後の読み込み自体を停止させるため、参照されない=「;=」代入も行われないので要注意。 記述の比較例 [State a]Type=varsetTrigger1=1var(5)=1[State a]Type=nullTrigger1=var(5) =1 上記の二つのステートコントローラーの処理は同一と言える。 どちらもVar(5)へ1を代入する記述である。 記述の注意点 [State a]Type=nullTrigger1=var(10) =1Trigger1=var(11) =0Trigger1=var(12) =5Trigger2=var(13) =10Trigger3=var(14) =500 こうした記述の場合var(12)とvar(14)の代入は行われない。 「 =」の注意点として代入は参照した時だけ行うことを忘れないこと。 [State a];内約解説Type=nullTrigger1=var(10) =1 ;○トリガー1・読み込み・真(0以外)なので次の同じ番号を参照Trigger1=var(11) =0 ;△トリガー1・読み込み・偽(0)なので同じ番号を参照せず、次の番号を参照。Trigger1=var(12) =5 ;×トリガー1・トリガー1で偽が出たので読み込まないTrigger2=var(13) =10;○トリガー2・トリガー1が読み込まれて偽が出たので読み込み。 ;真(0以外)だが、次の同じ番号がないので条件合致によりステートコントローラーを実行。Trigger3=var(14) =500;×トリガー3・トリガー2は読み込まれたが真で終わったので読み込まれず。 「 =」による代入を行う場合はこうした読み込みの条件と順番に注意しないといけない。 もし全ての行を参照させたい場合は以下のようにすること。 [State a];1||を入れることで条件を真にし、同じ番号を読み込ませ続ける。Type=nullTrigger1=1||var(10) =1Trigger1=1||var(11) =0Trigger1=1||var(12) =5Trigger1=1||var(13) =10Trigger1=1||var(14) =500;1||と同じ番号のTriggerを利用する方法[State a];0 を入れることで条件を偽にし、次の番号を読みこませる。Type=nullTrigger1=0 var(10) =1Trigger2=0 var(11) =0Trigger3=0 var(12) =5Trigger4=0 var(13) =10Trigger5=0 var(14) =500;0 と連続した番号のTriggerを利用する方法 上記のどちらも、全ての =によるVarSetを行う処理である。 計算式・条件式を交えて代入を行うばあいは、こうした調整をするのが基本。 なお行の順番が前後していても同じ番号→次の番号の優先順位なので注意。 パラメーターでの代入 パラメーターの読み込みは基本ステートコントローラーの処理が行われる場合。 またステートコントローラーで使用するパラメーターしか読み込まない 例としてはCommonステートページに書いたAI用の空中ジャンプ制御記述の一部。 ■AI側の記述[State -1, AI Air Jump]Type = ChangeStateValue = 45 + ( Var(*AirJump用Var*) = (1+Var(*AirJump用Var*)) )*0;ジャンプ回数を加算TriggerAll = Var(*AIフラグ*) ;AIフラグありTriggerAll = StateType = A Ctrl Pos Y -1*Const(Movement.AirJump.Height);前提条件TriggerAll =(Var(*AirJump用Var*) 1073741823) *AirJump.Num* ;ジャンプ回数制限Trigger1 = **** ;AI用の条件 処理が実行される場合にVar(*AirJump用Var*)に+1加算して代入を行うという記述 パラメーターは処理が実行されない場合は基本的に読み込みは行われない。 なおパラメーターによっては読み込み回数が増えるという話もあるので処理には要注意。 ちなみに条件式内で「 =」代入を行いパラメーターで指定すれば 計算したVarの数値をすぐパラメーターで使うことも可能。 複合Varset記述の例 記述の一例。 Var(0),Var(1),Var(2)をTempVarとして使用。 [State -1]type = varsetvar(0) = 1TriggerAll = 1 || var(0) = 0 ;tempリセットTriggerAll = 1 || var(1) = 0TriggerAll = 1 || var(2) = 0triggerall = StateType!=LTrigger1 = command = "b"Trigger1 = 1 || var(1) = 55Trigger2 = command = "a"Trigger2 = 1 || var(1) = 50Trigger3 = command = "y"Trigger3 = 1 || var(1) = 5Trigger4 = command = "x"Trigger4 = 1 || var(1) = 0ignorehitpause = 1[State -1]type = nulltriggerall = StateType!=LTriggerall = 1 || var(1) = var(1) + (StateType=A)*400 ;空中時600系にTriggerAll = 1 || var(2) = 2 ;Trigger1 = Command = "holddown" ;屈みTrigger1 = 1 || var(1) = var(1) + 200*(StateType!=A) + 30*(StateType=A) ;空中時+30 地上時400系Trigger1 = 1 || var(2) = ifelse(statetype!=A,1,4) ;空中ならLv4Trigger2 = Command = "holdfwd" ;前Trigger2 = 1 || var(1) = var(1) + 20 ;20系Trigger2 = 1 || var(2) = ifelse(statetype!=A,4,3) ;空中ならLv3Trigger3 = Command = "holdback";後ろTrigger3 = 1 || var(1) = var(1) + 10*(Statetype!=A) ;610系は無いのでTrigger3 = 1 || var(2) = 3 ; 「 =」による代入の応用に慣れるとこんな記述も可能になる。 前半 Varsetまず全てのVarを0にする 倒れ状態でない場合のみ下を処理する。 コマンドでbが押されたら55、aなら50、yなら5、xなら0の数値をvar(1)へ代入する。 「baxy」のいずれかが押されていたらvar(0)に1を代入。 後半 Null倒れ状態出ないことを確認する var(1)を空中の場合+400加算する。またvar(2)へ2を代入する。 方向キー下で、var(1)を空中でないなら+200、空中なら+30する。さらにvar(2)を空中でないなら1、空中なら4にし、読み込みを終了させる。 ↑で読み込み終了せず、方向キー前ならVar(1)に+20する。さらにvar(2)を空中でないなら4、空中なら3にし、読み込みを終了させる。 ↑で読み込み修旅せず、方向キー後ろならvar(2)を3にするさらにvar(1)を空中でない場合は+10する。 ちなみにこのvar(1)の数値は+200してステート移動の指定番号に使われる。 これにより「28個の技への移動」を移動含め3つのステートコントローラーで制御している。 (とはいえ、普通のキャラに使う記述ではないのは確か。おとなしくステコンを並べよう。)